package com.sysoa.dump;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.jfinal.kit.PathKit;
import com.jfinal.kit.PropKit;
import com.sysoa.util.ZipCompressing;

/**
 * @author 作者 E-mail:
 * @date 创建时间：2017年1月24日 上午11:09:19
 * @version 1.0
 * @parameter
 * @since
 * @return
 */
public class DumpMySql {
	private static final Logger logger = LoggerFactory.getLogger(DumpMySql.class);
	/**
	 * // 读取配置文件中的信息 // MySql的安装bin目录路径和dump等参数 String sqlurl =
	 * PropKit.get("sqlurl");//.getPropertyByName("property", "sqlurl"); //
	 * 保存备份文件的路径及名称 String path =
	 * PropKit.get("path");//GetProperty.getPropertyByName("property", "path");
	 * 
	 * public DumpMySql(){ PropKit.use("mysqldump.properties"); backup(); //
	 * 备份数据库 System.out.println("备份数据库成功!"); }
	 */

	public static String backup() {
		long startTime = System.currentTimeMillis();    //获取开始时间
		String zipstr = "";
		try {

			// 读取配置文件中的信息
			//PropKit.use("mysqldump.properties");
			// MySql的安装bin目录路径和dump等参数
			String sqlurl = PropKit.get("sqlurl3");// .getPropertyByName("property",
													// "sqlurl");
			// 保存备份文件的路径及名称
			String path0 = PropKit.get("path");// GetProperty.getPropertyByName("property",
												// "path");
			String path1 = new SimpleDateFormat("yyyyMMdd\\HHmmss").format(new Date());
			String filename = PropKit.get("filename");
			String path = path0+path1;
			Runtime rt = Runtime.getRuntime(); // 返回与当前的Java应用程序的运行时对象
			// 调用 调用mysql的安装目录的命令
			Process child = rt.exec(sqlurl);
			// 设置导出编码为utf-8。这里必须是utf-8
			// 把进程执行中的控制台输出信息写入.sql文件，即生成了备份文件。注：如果不对控制台信息进行读出，则会导致进程堵塞无法运行
			InputStream in = child.getInputStream();// 控制台的输出信息作为输入流
			InputStreamReader xx = new InputStreamReader(in, "utf-8");
			// 设置输出流编码为utf-8。这里必须是utf-8，否则从流中读入的是乱码
			String inStr;
			StringBuffer sb = new StringBuffer("");
			String outStr;
			// 组合控制台输出信息字符串
			BufferedReader br = new BufferedReader(xx);
			while ((inStr = br.readLine()) != null) {
				sb.append(inStr + "\r\n");
			}
			outStr = sb.toString();
			// 要用来做导入用的sql目标文件：
			// 判断目录和文件是否存在，不存在则创建

			File targetDir = new File(path);
			if (!targetDir.exists()) {
				targetDir.mkdirs();
			}
			File target = new File(targetDir, filename);
			if (!target.exists()) {
				target.createNewFile();
			}

			FileOutputStream fout = new FileOutputStream(path + "\\" + filename);
			OutputStreamWriter writer = new OutputStreamWriter(fout, "utf-8");

			writer.write(outStr);
			writer.flush();
			in.close();
			xx.close();
			br.close();
			writer.close();
			fout.close();
			
			copyFolder(PathKit.getWebRootPath()+"//file", path+"//file");
			copyFolder(PathKit.getWebRootPath()+"//img", path+"//img");
			
			zipstr = path0+"\\"+path1+".zip";
			//压缩文件
			ZipCompressing.zip(zipstr, new File(path));
			long endTime = System.currentTimeMillis();    //获取结束时间
			logger.info("备份成功!备份文件路径："+path+"备份时间："+(endTime-startTime)+"ms");
		} catch (Exception e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		}
		
		return zipstr;
	}

	/**
	 * 复制单个文件
	 * 
	 * @param oldPath
	 *            String 原文件路径 如：c:/fqf.txt
	 * @param newPath
	 *            String 复制后路径 如：f:/fqf.txt
	 * @return boolean
	 */
	@SuppressWarnings({ "resource", "unused" })
	public static void copyFile(String oldPath, String newPath) {
		try {
			int bytesum = 0;
			int byteread = 0;
			File oldfile = new File(oldPath);
			if (oldfile.exists()) { // 文件存在时
				InputStream inStream = new FileInputStream(oldPath); // 读入原文件
				FileOutputStream fs = new FileOutputStream(newPath);
				byte[] buffer = new byte[1444];
				int length;
				while ((byteread = inStream.read(buffer)) != -1) {
					bytesum += byteread; // 字节数 文件大小
					logger.info(bytesum+"");
					fs.write(buffer, 0, byteread);
				}
				inStream.close();
			}
		} catch (Exception e) {
			logger.info("复制单个文件操作出错");
			e.printStackTrace();

		}

	}

	/**
	 * 复制整个文件夹内容
	 * 
	 * @param oldPath
	 *            String 原文件路径 如：c:/fqf
	 * @param newPath
	 *            String 复制后路径 如：f:/fqf/ff
	 * @return boolean
	 */
	public static void copyFolder(String oldPath, String newPath) {

		try {
			(new File(newPath)).mkdirs(); // 如果文件夹不存在 则建立新文件夹
			File a = new File(oldPath);
			String[] file = a.list();
			File temp = null;
			for (int i = 0; i < file.length; i++) {
				if (oldPath.endsWith(File.separator)) {
					temp = new File(oldPath + file[i]);
				} else {
					temp = new File(oldPath + File.separator + file[i]);
				}

				if (temp.isFile()) {
					FileInputStream input = new FileInputStream(temp);
					FileOutputStream output = new FileOutputStream(newPath + "/" + (temp.getName()).toString());
					byte[] b = new byte[1024 * 5];
					int len;
					while ((len = input.read(b)) != -1) {
						output.write(b, 0, len);
					}
					output.flush();
					output.close();
					input.close();
				}
				if (temp.isDirectory()) {// 如果是子文件夹
					copyFolder(oldPath + "/" + file[i], newPath + "/" + file[i]);
				}
			}
		} catch (Exception e) {
			logger.info("复制整个文件夹内容操作出错");
			e.printStackTrace();

		}

	}
	
     
	
	

	public static void main(String[] args) {
		backup();
		
	}
}
